<<<<<<< HEAD
package main

import (
	"encoding/json"
	"fmt"

	"github.com/vmihailenco/msgpack"
)

type s struct {
	data map[string]interface{}
}

type Person struct {
	Name   string
	Age    int
	Gender string
}

func main() {
	var p = Person{
		Name:   "张三",
		Age:    128,
		Gender: "李四",
	}
	o, _ := msgpack.Marshal(p)
	fmt.Println("msgpck===>", o)

	var q = Person{}
	msgpack.Unmarshal(o, &q)
	fmt.Println(q)

	// -------------------------------------
	// json 序列化
	a := s{
		data: make(map[string]interface{}, 8),
	}
	a.data["count"] = 1
	result, _ := json.Marshal(a.data)
	fmt.Println(string(result))

	b := s{
		data: make(map[string]interface{}, 8),
	}
	json.Unmarshal(result, &b.data)
	fmt.Println(b)
	// -------------------------------------

}
=======
// gin 框架 介绍和使用

// Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架,
//  由于使用了httprouter，速度提高了近40倍。 如果你是性能和高效的追求者, 你会爱上Gin。

// Gin框架介绍
// Go世界里最流行的Web框架，Github上有32K+star。 基于httprouter开发的Web框架。
// 中文文档齐全，简单易用的轻量级框架。

// go 的语法和设计模式和性能 你会慢慢喜欢上

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// 简单的gin 例子
func main() {
	// 不使用任何的中间件 ，这个就是最纯真的路由
	r := gin.Default()
	// context 的功能强大，控制G的开始结束和G的内存释放，原生的比自己的好
	// 定义路由 /hello 和路由对应的方法类似django的k(路由) --v(函数)
	// 这里是装饰器，同时使用了二叉树来处理不同的路由
	r.GET("/hello", func(c *gin.Context) {
		// 200 状态码，gin.H 规定返回的格式json
		c.JSON(200, gin.H{
			"message": "hello gin",
		})
	})
	// -------------------json渲染借助struct------------------------------
	r.GET("/moreJson", func(c *gin.Context) {
		var msg struct {
			Name    string `json:"user"` // 后面的Tag的获取可以通过reflect反射
			Message string
			Age     int
		}
		msg.Name = "张三"
		msg.Message = "你好"
		msg.Age = 19999
		c.JSON(http.StatusOK, msg)
	})
	// -------------------json渲染借助struct------------------------------
	// 关于参数的解析 这里只说语法 了
	// -------<获取url?中的参数>--------
	// c.DefaultQuery(Name,"") @Name<string> :就是要取的参数名，后面可以设置默认值
	// 类似c.Query(Name)
	// -------<获取form中的参数>--------
	// c.DefaultPostForm(Name,"") 同上
	// c.PostForm(Name) @Name<string> : 表单参数获取
	// -------<获取url中路径的参数>--------
	// c.Param(Name) @Name<string> : 获取路径传参
	// -------<请求参数绑定>--------
	// 绑定到定义的结构体上，结构体的Tag可以规定和校验参数的类型和规范
	// c.ShouldBind(&struct)
	// 启动 0.0.0.0：8080默认 就是这么简单一个高性能的web服务启动了
	// -------------------路由重定向------------------------------
	// HTTP重定向
	r.GET("/test", func(c *gin.Context) {
		c.Redirect(http.StatusMovedPermanently, "http://www.sogo.com/")
	})
	// 路由重定向
	r.GET("/test1", func(c *gin.Context) {
		c.Request.URL.Path = "/test2"
		r.HandleContext(c)
	})
	r.GET("/test2", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"hello": "小猪"})
	})
	// ----------------------------------------------------------
	// 上面都是普通的路由
	// 接下来就是不普通的
	// ****路由组****
	// userGroup := r.Group("/user")
	// {
	// 	userGroup.GET("/index",func(c *gin.Context){...})
	// 	userGroup.POST("/index",func(c *gin.Context){...})
	// }
	// 嵌套路由组
	// xx := shopGroup.Group("xx")
	// xx.GET("/oo",func....)
	// 嵌套 主要是用于划分业务逻辑或者API版本的时候
	// ****路由管理****
	// Gin框架中的路由使用的是httprouter这个库。
	// 文档参考:https://github.com/julienschmidt/httprouter
	// 其基本原理就是构造一个路由地址的前缀树。

	r.Run()
}

// gin 也有自己的渲染HTML 可以适当网上查看对应文档
// 这里不做太多的解释，我们主要以MVC框架开展为主，T的话可以简单查看一下文档就可以了
// 文档参考链接:https://www.liwenzhou.com/posts/Go/Gin_framework/
// gin 并发服务可以查看traning--demo2--main.go
>>>>>>> 4925e93374cf8c3a0dff85b9a22729f970dc1768
